home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / SNNSV32.ZIP / SNNSv3.2 / xgui / sources / bn_art2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-25  |  12.0 KB  |  491 lines

  1. /*****************************************************************************
  2.   FILE           : bn_art2.c
  3.   SHORTNAME      : bn_art2
  4.   SNNS VERSION   : 3.2
  5.  
  6.   PURPOSE        : Creates the ART2-window and ART2 networks. 
  7.   NOTES          :
  8.  
  9.   AUTHOR         : Kai-Uwe Herrmann
  10.   DATE           : 15.1.1993
  11.  
  12.   CHANGED BY     : 
  13.   IDENTIFICATION : @(#)bn_art2.c    1.9 3/2/94
  14.   SCCS VERSION   : 1.9
  15.   LAST CHANGE    : 3/2/94
  16.  
  17.              Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG
  18.  
  19. ******************************************************************************/
  20.  
  21.  
  22.  
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <X11/Xlib.h>
  26. #include <X11/Xutil.h>
  27. #include <X11/Xos.h>
  28. #include <X11/cursorfont.h>
  29. #include <X11/Intrinsic.h>
  30. #include <X11/StringDefs.h>
  31. #include <X11/Shell.h>
  32. #include <X11/Xaw/Box.h>
  33. #include <X11/Xaw/Simple.h>
  34. #include <X11/Xaw/Grip.h>
  35. #include <X11/Xaw/Form.h>
  36. #include <X11/Xaw/SmeBSB.h>
  37. #include <X11/Xaw/SmeLine.h>
  38. #include <X11/Xaw/Viewport.h>
  39. #include <X11/Xaw/Label.h>
  40. #include <X11/Xaw/Toggle.h>
  41. #include <X11/Xaw/Command.h>
  42. #include <X11/Xaw/Cardinals.h>
  43. #include <X11/Xaw/AsciiText.h>
  44. #include <X11/Xaw/Scrollbar.h>
  45.  
  46. #include "ui.h"
  47. #include "glob_typ.h"
  48. #include "kr_ui.h"
  49. #include "ui_mainP.h"
  50. #include "ui_confirmer.h"
  51. #include "ui_textP.h"
  52. #include "ui_utilP.h"
  53. #include "ui_netUpdate.h"
  54. #include "ui_status.h"
  55. #include "ui_xWidgets.h"
  56. #include "ui_fileP.h"
  57. #include "ui_display.h"
  58. #include "ui_event.h"
  59. #include "ui_selection.h"
  60.  
  61. #include "bn_basics.h"
  62.  
  63. #include "bn_art2.ph"
  64.  
  65.  
  66.  
  67. /*****************************************************************************
  68.   FUNCTION : bn_art2_make_layer
  69.  
  70.   PURPOSE  : Generation of a complete layer
  71.   NOTES    : 
  72.  
  73.   UPDATE   : 20.1.1993
  74. ******************************************************************************/
  75.  
  76. static krui_err bn_art2_make_layer (
  77.                             int    units,
  78.                             int    rows,
  79.                             int    cols,
  80.                             int    Xbegin,
  81.                             int    Ybegin,
  82.                             int    Xsep,
  83.                             int    Ysep,
  84.                             char  *name_prefix,
  85.                             int    unit_ttype,
  86.                             char  *actfuncname,
  87.                             char  *outfuncname,
  88.                             int    NoOfSites,
  89.                             char **SiteNames,
  90.                             char **SiteFuncNames)
  91.                          
  92.  
  93. {
  94.    krui_err             ret_code = KRERR_NO_ERROR;
  95.  
  96.    int                  row;
  97.    int                  col;
  98.    int                  count;
  99.    int                  last_col;
  100.    int                  unit_no;
  101.    struct PosType       unit_pos;
  102.    char                 *site_name;
  103.    int                  site_no;
  104.    char                 name[10];
  105.  
  106.  
  107.    /* Create Units */
  108.    for (row = 1, count = 0; row <= rows; row++) {
  109.  
  110.       if ((units % rows) > 0) {
  111.          last_col = POS_SIGN((units-count) % (rows-row+1));
  112.       } else {
  113.          last_col = 1;
  114.       } /*if*/
  115.  
  116.       for (col = 1; col <= (cols-1+last_col); col++) {
  117.  
  118.          count++;
  119.  
  120.          unit_no = krui_createDefaultUnit();
  121.          if (unit_no < 0)  CHECK_RETURN (unit_no);
  122.  
  123.          ret_code = krui_setUnitTType (unit_no, unit_ttype);
  124.          CHECK_RETURN( ret_code );
  125.  
  126.          ret_code = krui_setUnitActFunc(unit_no, actfuncname);
  127.          CHECK_RETURN (ret_code);
  128.  
  129.          ret_code = krui_setUnitOutFunc(unit_no, outfuncname);
  130.          CHECK_RETURN (ret_code);
  131.  
  132.          if (units > 1) {
  133.             sprintf (name,"%s%d",name_prefix,count);
  134.          } else {
  135.             sprintf (name,"%s",name_prefix);
  136.          } /*if*/
  137.  
  138.          ret_code = krui_setUnitName (unit_no, name);
  139.          CHECK_RETURN (ret_code);
  140.  
  141.          unit_pos.x = Xbegin + Xsep*(col-1);
  142.          unit_pos.y = Ybegin + Ysep*(row-1);
  143.          krui_setUnitPosition( unit_no, &unit_pos );
  144.  
  145.          ret_code = krui_setCurrentUnit (unit_no);
  146.          CHECK_RETURN (ret_code);
  147.  
  148.          /* Add Sites */
  149.          site_no = 1;
  150.          while (site_no <= NoOfSites) {
  151.              site_name= *(SiteNames+(site_no-1));
  152.  
  153.              if (site_name != NULL) {
  154.                 ret_code = krui_addSite (site_name);
  155.                 CHECK_RETURN (ret_code);
  156.              } /*if*/
  157.  
  158.              site_no++;
  159.          } /*while*/
  160.  
  161.       } /*for*/
  162.  
  163.    } /*for*/
  164.  
  165.    return (ret_code);
  166.  
  167.  
  168.  
  169.  
  170. /*****************************************************************************
  171.   FUNCTION : bn_art2_createNet
  172.  
  173.   PURPOSE  : Generation of the ART2 network using SNNS kernel functions.
  174.   NOTES    :
  175.  
  176.   UPDATE   : 20.1.1993
  177. ******************************************************************************/
  178.  
  179. static krui_err bn_art2_createNet (int f1Units, int f1Rows, int f2Units, int f2Rows)
  180.  
  181. {
  182.    krui_err          ret_code   = KRERR_NO_ERROR;
  183.  
  184.    int               i, j;
  185.  
  186.  
  187.    /********* create units ******************/
  188.  
  189.    /* create Input Layer  */
  190.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, INP_X, INP_Y,
  191.                           1, 1, "inp", INPUT, ACTF_INP, OUTF_INP, 0,
  192.                           NULL, NULL);
  193.    CHECK_RETURN (ret_code);
  194.  
  195.    /* create W-Units */
  196.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, W_X, W_Y,
  197.                           F1_SEP_X, F1_SEP_Y, "w",
  198.                           HIDDEN, ACTF_W, OUTF_W, 0, NULL, NULL);
  199.    CHECK_RETURN (ret_code);
  200.  
  201.  
  202.  
  203.    /* create X-Units */
  204.  
  205.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, X_X, X_Y,
  206.                           F1_SEP_X, F1_SEP_Y, "x", HIDDEN, ACTF_X,
  207.                           OUTF_X, 0, NULL, NULL);
  208.    CHECK_RETURN (ret_code);
  209.  
  210.  
  211.    /* create U-Units */
  212.  
  213.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, U_X, U_Y,
  214.                           F1_SEP_X, F1_SEP_Y, "u", HIDDEN, ACTF_U,
  215.                           OUTF_U, 0, NULL, NULL);
  216.    CHECK_RETURN (ret_code);
  217.  
  218.    /* create V-Units */
  219.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, V_X, V_Y,
  220.                           F1_SEP_X, F1_SEP_Y, "v",
  221.                           HIDDEN, ACTF_V, OUTF_V, 0, NULL, NULL);
  222.    CHECK_RETURN (ret_code);
  223.  
  224.    /* create P-Units */
  225.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, P_X, P_Y,
  226.                           F1_SEP_X, F1_SEP_Y, "p",
  227.                           HIDDEN, ACTF_P, OUTF_P, 0, NULL, NULL);
  228.    CHECK_RETURN (ret_code);
  229.  
  230.    /* create Q-Units */
  231.  
  232.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, Q_X, Q_Y,
  233.                           F1_SEP_X, F1_SEP_Y, "q", HIDDEN, ACTF_Q,
  234.                           OUTF_Q, 0, NULL, NULL);
  235.    CHECK_RETURN (ret_code);
  236.  
  237.    /* create R-Units */
  238.  
  239.    ret_code = bn_art2_make_layer (f1Units, f1Rows, F1_COLS, R_X, R_Y,
  240.                           F1_SEP_X, F1_SEP_Y, "r", HIDDEN, ACTF_R,
  241.                           OUTF_R, 0, NULL, NULL);
  242.    CHECK_RETURN (ret_code);
  243.  
  244.    /* create Recognition Layer */
  245.    ret_code = bn_art2_make_layer (f2Units, f2Rows, F2_COLS, REC_X, REC_Y, 1, 1,
  246.                           "rec", SPECIAL, ACTF_REC, OUTF_REC, 0, NULL, NULL);
  247.    CHECK_RETURN (ret_code);
  248.  
  249.    ret_code = bn_art2_make_layer (f2Units, f2Rows, F2_COLS, RST_X, RST_Y, 1, 1,
  250.                           "rst", HIDDEN, ACTF_RST, OUTF_RST, 0, NULL, NULL);
  251.    CHECK_RETURN (ret_code);
  252.  
  253.  
  254.  
  255.  
  256.    /********* Create Links **************************************/
  257.  
  258.  
  259.    /* TO w units */
  260.    for (i=1; i<=f1Units; i++) {
  261.  
  262.       ret_code = krui_setCurrentUnit (W_UNIT(i));
  263.       CHECK_RETURN (ret_code);
  264.  
  265.       /* FROM inp units */
  266.       ret_code = krui_createLink (INP_UNIT(i),0.0);
  267.       CHECK_RETURN (ret_code);
  268.  
  269.       /* FROM u units */
  270.       ret_code = krui_createLink (U_UNIT(i), 0.0);
  271.       CHECK_RETURN (ret_code);
  272.  
  273.    } /*for*/
  274.  
  275.  
  276.    /* TO x units */
  277.    for (i=1; i<=f1Units; i++) {
  278.  
  279.       ret_code = krui_setCurrentUnit (X_UNIT(i));
  280.       CHECK_RETURN (ret_code);
  281.  
  282.       /* FROM w units */
  283.       ret_code = krui_createLink (W_UNIT(i),0.0);
  284.       CHECK_RETURN (ret_code);
  285.  
  286.    } /*for*/
  287.  
  288.  
  289.    /* TO u units */
  290.    for (i=1; i<=f1Units; i++) {
  291.  
  292.       ret_code = krui_setCurrentUnit (U_UNIT(i));
  293.       CHECK_RETURN (ret_code);
  294.  
  295.       /* FROM v units */
  296.       ret_code = krui_createLink (V_UNIT(i),0.0);
  297.       CHECK_RETURN (ret_code);
  298.  
  299.    } /*for*/
  300.  
  301.  
  302.    /* TO v units */
  303.    for (i=1; i<=f1Units; i++) {
  304.  
  305.       ret_code = krui_setCurrentUnit (V_UNIT(i));
  306.       CHECK_RETURN (ret_code);
  307.  
  308.       /* FROM x units */
  309.       ret_code = krui_createLink (X_UNIT(i),0.0);
  310.       CHECK_RETURN (ret_code);
  311.  
  312.       /* FROM q unit */
  313.       ret_code = krui_createLink (Q_UNIT(i), 0.0);
  314.       CHECK_RETURN (ret_code);
  315.  
  316.    } /*for*/
  317.  
  318.  
  319.    /* TO p units */
  320.    for (i=1; i<=f1Units; i++) {
  321.  
  322.       ret_code = krui_setCurrentUnit (P_UNIT(i));
  323.       CHECK_RETURN (ret_code);
  324.  
  325.       /* FROM rec units */
  326.       for (j=1; j<=f2Units; j++) {
  327.          ret_code = krui_createLink (REC_UNIT(j),0.0);
  328.          CHECK_RETURN (ret_code);
  329.       } /*for*/
  330.  
  331.       /* FROM u unit */
  332.       ret_code = krui_createLink (U_UNIT(i), 0.0);
  333.       CHECK_RETURN (ret_code);
  334.  
  335.    } /*for*/
  336.  
  337.  
  338.    /* TO q units */
  339.    for (i=1; i<=f1Units; i++) {
  340.  
  341.       ret_code = krui_setCurrentUnit (Q_UNIT(i));
  342.       CHECK_RETURN (ret_code);
  343.  
  344.       /* FROM p unit */
  345.       ret_code = krui_createLink (P_UNIT(i), 0.0);
  346.       CHECK_RETURN (ret_code);
  347.  
  348.    } /*for*/
  349.  
  350.  
  351.    /* TO r units */
  352.    for (i=1; i<=f1Units; i++) {
  353.  
  354.       ret_code = krui_setCurrentUnit (R_UNIT(i));
  355.       CHECK_RETURN (ret_code);
  356.  
  357.       /* FROM p unit */
  358.       ret_code = krui_createLink (P_UNIT(i), 0.0);
  359.       CHECK_RETURN (ret_code);
  360.  
  361.       /* FROM inp unit */
  362.       ret_code = krui_createLink (INP_UNIT(i), 0.0);
  363.       CHECK_RETURN (ret_code);
  364.  
  365.    } /*for*/
  366.  
  367.  
  368.    /* TO rec units */
  369.    for (i=1; i<=f2Units; i++) {
  370.  
  371.       ret_code = krui_setCurrentUnit (REC_UNIT(i));
  372.       CHECK_RETURN (ret_code);
  373.  
  374.       /* FROM p units */
  375.       for (j=1; j<=f1Units; j++) {
  376.          ret_code = krui_createLink (P_UNIT(j), 0.0);
  377.          CHECK_RETURN (ret_code);
  378.       } /*for*/
  379.  
  380.       /* FROM rst unit */
  381.       ret_code = krui_createLink (RST_UNIT(i), 0.0);
  382.       CHECK_RETURN (ret_code);
  383.  
  384.    } /*for*/
  385.  
  386.  
  387.    /* TO rst units */
  388.    for (i=1; i<=f2Units; i++) {
  389.  
  390.       ret_code = krui_setCurrentUnit (RST_UNIT(i));
  391.       CHECK_RETURN (ret_code);
  392.  
  393.       /* FROM rec units */
  394.       ret_code = krui_createLink (REC_UNIT(i), 0.0);
  395.       CHECK_RETURN (ret_code);
  396.  
  397.    } /*for*/
  398.  
  399.    printf (" Done.\n");
  400.  
  401.  
  402.    /*  set the update function  */
  403.    ret_code = krui_setUpdateFunc (UPDATE_FUNC_NAME);
  404.    CHECK_RETURN( ret_code );
  405.  
  406.    /* set the learning function */
  407.    ret_code = krui_setLearnFunc (LEARN_FUNC_NAME);
  408.  
  409.    return (ret_code);
  410. }
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417. /*****************************************************************************
  418.   FUNCTION : bn_art2_donePROC
  419.  
  420.   PURPOSE  : Callback function for DONE button in art2
  421.   NOTES    :
  422.  
  423.   UPDATE   : 20.1.1993
  424. ******************************************************************************/
  425.  
  426. static void bn_art2_donePROC (void)
  427.  
  428. {
  429.  
  430.    XtDestroyWidget (baseWidget);
  431.    bn_art2_open = 0;
  432.  
  433. }
  434.  
  435.  
  436.  
  437. /*****************************************************************************
  438.   FUNCTION : bn_art2_createPROC
  439.  
  440.   PURPOSE  : Callback function for CREATE NET button in art2
  441.   NOTES    :
  442.  
  443.   UPDATE   : 20.1.1993
  444. ******************************************************************************/
  445.  
  446. static void bn_art2_createPROC (void)
  447.  
  448. {
  449.   int units[2], rows[2];
  450.   int NoOfLayers = 2;
  451.  
  452.   if (bn_basics_check_existingNetwork()) {
  453.  
  454.      bn_basics_getValues (NoOfLayers, units, rows, art2UnitWidget, art2RowWidget);
  455.  
  456.      if (bn_basics_checkValues(NoOfLayers, units, rows)) {
  457.         bn_art2_createNet (units[0], rows[0], units[1], rows[1]);
  458.         bn_basics_refresh ();
  459.         ui_confirmOk ("Network created!");
  460.      } /*if*/
  461.  
  462.   } /*if*/
  463.  
  464.   return;
  465.  
  466. }
  467.  
  468.  
  469.  
  470. /*****************************************************************************
  471.   FUNCTION : bn_createART2
  472.  
  473.   PURPOSE  : create ART2 panel
  474.   NOTES    :
  475.  
  476.   UPDATE   : 20.1.1993
  477. ******************************************************************************/
  478.  
  479. void bn_createART2(void)
  480.  
  481. {
  482.   bn_basics_createART (ART2_MODEL, &baseWidget, &bn_art2_open,
  483.                        art2UnitWidget, art2RowWidget,
  484.                        (XtCallbackProc) bn_art2_createPROC,
  485.                        (XtCallbackProc) bn_art2_donePROC);
  486.  
  487.  
  488. }
  489.  
  490.